package com.marketing.tenant.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.marketing.tenant.context.UserContext;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

import java.util.Arrays;
import java.util.List;

/**
 * MyBatis-Plus多租户配置
 */
@Configuration
public class TenantConfig {

    private static final Logger log = LoggerFactory.getLogger(TenantConfig.class);

    /**
     * 多租户插件配置
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        
        // 添加多租户插件
        TenantLineInnerInterceptor tenantLineInnerInterceptor = new TenantLineInnerInterceptor(new TenantLineHandler());
        interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
        
        log.info("MyBatis-Plus多租户插件配置完成");
        return interceptor;
    }

    /**
     * 多租户处理器
     */
    public static class TenantLineHandler implements com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler {

        private static final Logger log = LoggerFactory.getLogger(TenantLineHandler.class);

        /**
         * 租户字段名
         */
        private static final String TENANT_ID_COLUMN = "tenant_id";

        /**
         * 忽略多租户处理的表名列表
         */
        private static final List<String> IGNORE_TABLES = Arrays.asList(
                // 系统表
                "sys_user",
                "sys_role", 
                "sys_permission",
                "sys_resource",
                "sys_user_role",
                "sys_role_permission",
                // 租户管理相关表
                "saas_tenant",                    // 租户主表本身不需要租户隔离
                "saas_subscription_plan",         // 订阅计划表是全局共享的
                // 其他全局共享表
                "sys_dict",
                "sys_dict_data",
                "sys_config"
        );

        @Override
        public Expression getTenantId() {
            // 从用户上下文获取当前租户ID
            UserContext.UserInfo userInfo = UserContext.getUser();
            if (userInfo != null && userInfo.getTenantId() != null) {
                Long tenantId = userInfo.getTenantId();
                log.debug("获取当前租户ID: {}", tenantId);
                return new LongValue(tenantId);
            }
            
            // 如果没有用户上下文，可能是系统内部调用，使用默认租户ID
            log.debug("未找到用户上下文，使用默认租户ID: 1");
            return new LongValue(1L);
        }

        @Override
        public String getTenantIdColumn() {
            return TENANT_ID_COLUMN;
        }

        @Override
        public boolean ignoreTable(String tableName) {
            // 检查表名是否在忽略列表中
            boolean ignore = IGNORE_TABLES.contains(tableName.toLowerCase());
            if (ignore) {
                log.debug("忽略多租户处理的表: {}", tableName);
            }
            return ignore;
        }

        @Override
        public boolean ignoreInsert(List<net.sf.jsqlparser.schema.Column> columns, String tenantIdColumn) {
            // 检查插入语句中是否已经包含了租户ID字段
            return columns.stream().anyMatch(column -> 
                tenantIdColumn.equalsIgnoreCase(column.getColumnName()));
        }
    }
}